﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Security.Principal;

namespace ProyectoCine
{
    public class Global : System.Web.HttpApplication
    {

        void Application_Start(object sender, EventArgs e)
        {
            // Código que se ejecuta al iniciarse la aplicación

        }

        void Application_End(object sender, EventArgs e)
        {
            //  Código que se ejecuta cuando se cierra la aplicación

        }

        void Application_Error(object sender, EventArgs e)
        {
            // Código que se ejecuta al producirse un error no controlado

        }

        void Session_Start(object sender, EventArgs e)
        {
            // Código que se ejecuta cuando se inicia una nueva sesión

        }

        void Session_End(object sender, EventArgs e)
        {
            // Código que se ejecuta cuando finaliza una sesión.
            // Nota: el evento Session_End se desencadena sólo cuando el modo sessionstate
            // se establece como InProc en el archivo Web.config. Si el modo de sesión se establece como StateServer 
            // o SQLServer, el evento no se genera.

        }
        //protected void Application_AuthenticateRequest(object sender,EventArgs e)
        //{
        //    // Recupera la cookie
        //    HttpCookie authCookie = Context.Request.Cookies[".ProyectoCine"];
        //    if (null == authCookie)
        //    {
        //        // Si no existe termina
        //        return;
        //    }
        //    FormsAuthenticationTicket autTicket = null;
        //    try
        //    {
        //        autTicket = FormsAuthentication.Decrypt(authCookie.Value);
        //    }
        //    catch (Exception ex)
        //    {
        //        return;
        //    }
        //    if (null == autTicket)
        //    {
        //        // No se pudo desencriptar
        //        return;
        //    }
        //    // Separo los roles
        //    String[] roles = autTicket.UserData.Split(new char[] { '|' });
        //    // Creo un objeto Identity y lo vinculo al Context
        //    GenericIdentity id = new GenericIdentity(autTicket.Name, "testSeguridad");
        //    GenericPrincipal principal = new GenericPrincipal(id,roles);
        //    Context.User = principal;
        //}
        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

            // Si se envía alguna información acerca del usuario

            if (HttpContext.Current.User != null)
            {

                // se comprueba que el usuario esté autenticado

                if (HttpContext.Current.User.Identity.IsAuthenticated)
                {

                    // Se comprueba si el usuario está autenticado por formulario

                    if (HttpContext.Current.User.Identity is FormsIdentity)
                    {

                        // Se recupera la identidad del usuario para recuperar sus roles

                        FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity;

                        // Se recupera el ticket del usuario

                        FormsAuthenticationTicket ticket = identity.Ticket;

                        // Se recupera la información acerca del usuario, donde metimos la información de los roles

                        string[] roles = ticket.UserData.Split(';');

                        // Se crea un usuario con dichos roles

                        HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(identity, roles);

                    }

                }

            }

        }

    }
}
